package org.feng.component;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author feng
 */
public class RedisComponent {

    private static RedisTemplate<String, Object> redisTemplate;


    /**
     * 获取redis 分布式锁
     *
     * @param key      key值
     * @param value    内容
     * @param timeout  数据存在时间
     * @param timeUnit 时间单位
     * @return 是否获取到锁   true： 获取到了  false：没获取到
     */
    public static Boolean getLock(String key, String value, Long timeout, TimeUnit timeUnit) {
        return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit);
    }

    /**
     * 获取redis分布式锁（自旋）
     *
     * @param key        key值
     * @param value      内容
     * @param timeout    数据存在时间
     * @param timeUnit   时间单位
     * @param retryCount 重试获取锁的次数
     * @return 是否获取到锁   true： 获取到了  false：没获取到
     * @throws InterruptedException 线程休眠异常
     */
    public static Boolean getSpinLock(String key, String value, Long timeout, TimeUnit timeUnit, Integer retryCount) throws InterruptedException {
        Boolean flag = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit);
        if (Boolean.FALSE.equals(flag)) {
            for (int i = 0; i < retryCount; i++) {
                Thread.sleep(1000);
                flag = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit);
                if (Boolean.TRUE.equals(flag)) {
                    break;
                }
            }
        }
        return flag;
    }
}
